import router from "@/router";
// 引入全局设置
import setting from "./setting";
// 引入进度条
import nprogress from "nprogress";
// 引入进度条样式
import "nprogress/nprogress.css";
nprogress.configure({ showSpinner: false });
// 引入仓库
// 要先引入pinia，因为此时main.ts中还未使用app.use(pinia),所以相当于未激活
import pinia from "./store";
import useUserStore from "./store/modules/user";
import { ElMessage } from "element-plus";
// 引入工具库
import { isEmpty } from "./utils/tools/isEmpty";
// 传参的意思：Pinia instance to retrieve the store（通过仓库实例来检索）
const UserStore = useUserStore(pinia);
// 未登录允许前往的路由
const goAbleArr = ["/login", "/register", "/home", "/search/subject", "/search/user"];
// 全局前置守卫
router.beforeEach((to: any, from: any, next: any) => {
    nprogress.start();
    const token = UserStore.token;
    const userName = UserStore.userName;
    document.title = `${setting.title}-${to.meta.title}`;
    if (token) {
        // 如果登录了不能去哪里
        if (to.path == "/login") {
            next("/home");
        } else {
            // 如果是去其他页面，就判断是否有用户数据
            if (!isEmpty(userName) && userName !== "游客") {
                // 如果有用户数据的话就正常跳转
                next();
            } else {
                // 如果没有用户数据的话，就要发起请求获取
                UserStore.userInfo().then(
                    () => {
                        // 获取信息成功的话就跳转
                        next(to);
                    },
                    (error) => {
                        // 获取信息失败的话就告知用户错误
                        ElMessage.error(error.message);
                        // 清除token
                        UserStore.userLogout().then(
                            () => {
                                // 跳转回登录界面
                                next({ path: "/login", query: { redirect: to.path } });
                            },
                            (error) => {
                                ElMessage.error(error.message);
                            },
                        );
                    },
                );
            }
        }
    } else {
        // 如果未登录的话，就跳转到登录界面并且保存重定向数据
        if (goAbleArr.includes(to.path)) {
            next();
        } else {
            ElMessage.error("请先登录!");
            next({ path: "/login", query: { redirect: to.path } });
        }
    }
});

// 全局后置守卫（在dom元素渲染前调用）
router.afterEach(() => {
    nprogress.done();
});
